<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>医院预约挂号系统设计报告</title>
    <style>
        body {
            font-family: 'Microsoft YaHei', SimSun, sans-serif;
            line-height: 1.8;
            margin: 40px;
            color: #333;
            background-color: #fafafa;
        }

        h1 {
            color: #2c3e50;
            text-align: center;
            border-bottom: 3px solid #3498db;
            padding-bottom: 15px;
            margin-bottom: 30px;
        }

        h2 {
            color: #34495e;
            border-left: 5px solid #3498db;
            padding-left: 15px;
            margin-top: 30px;
        }

        h3 {
            color: #7f8c8d;
            margin-top: 25px;
        }

        .section {
            background: white;
            padding: 25px;
            margin-bottom: 25px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }

        .code-block {
            background-color: #2c3e50;
            color: #ecf0f1;
            padding: 20px;
            border-radius: 5px;
            overflow-x: auto;
            font-family: 'Consolas', 'Monaco', monospace;
            margin: 15px 0;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin: 15px 0;
            background: white;
        }

        th,
        td {
            border: 1px solid #bdc3c7;
            padding: 12px;
            text-align: left;
        }

        th {
            background-color: #3498db;
            color: white;
        }

        .highlight {
            background-color: #f1c40f;
            padding: 2px 5px;
            border-radius: 3px;
        }

        .important {
            background-color: #e74c3c;
            color: white;
            padding: 2px 6px;
            border-radius: 3px;
        }

        ul,
        ol {
            margin: 15px 0;
            padding-left: 30px;
        }

        .diagram {
            text-align: center;
            margin: 20px 0;
            padding: 15px;
            background: #ecf0f1;
            border-radius: 5px;
        }
    </style>
</head>

<body>

    <h1>医院预约挂号系统设计报告</h1>

    <div class="section">
        <h2>一、需求分析</h2>

        <h3>1. 设计题目</h3>
        <p>基于Python的医院预约挂号系统设计与实现</p>

        <h3>2. 系统功能需求分析</h3>
        <p>在现代医疗服务中，预约挂号已经成为患者就医的主要途径。传统的现场排队挂号不仅效率低下，还容易造成人员聚集，特别是在疫情期间更显得不合时宜。因此，我决定设计一个数字化的医院预约挂号系统来解决这些问题。</p>

        <p>经过对实际医院业务流程的调研和分析，我确定了系统需要实现的核心功能。首先是用户管理模块，这是整个系统的基础。患者和医生都需要注册账户才能使用系统，但他们的角色和权限完全不同。患者主要进行预约操作，而医生则负责管理自己的出诊时间。为了保证数据安全，我采用了SHA256哈希算法对所有用户密码进行加密存储，这样即使数据库被非法访问，原始密码也不会泄露。
        </p>

        <p>预约管理是系统的核心业务模块。在设计过程中，我发现最大的挑战是如何处理时间冲突问题。医生的出诊时间是有限的，多个患者可能同时预约同一个时间段，这就需要系统能够智能地管理时间资源。我设计了一个基于时间段分割的算法，当患者预约某个时间段时，系统会自动将医生的可用时间段进行切分，确保不会出现重复预约的情况。
        </p>

        <table>
            <tr>
                <th>功能模块</th>
                <th>主要功能</th>
                <th>用户类型</th>
                <th>技术特点</th>
            </tr>
            <tr>
                <td>用户认证</td>
                <td>注册、登录、密码加密</td>
                <td>患者、医生</td>
                <td>SHA256哈希加密</td>
            </tr>
            <tr>
                <td>预约管理</td>
                <td>创建预约、取消预约、查看预约</td>
                <td>患者</td>
                <td>时间冲突检测</td>
            </tr>
            <tr>
                <td>时间管理</td>
                <td>设置出诊时间、管理时间段</td>
                <td>医生</td>
                <td>动态时间段分割</td>
            </tr>
            <tr>
                <td>数据持久化</td>
                <td>数据保存、加载</td>
                <td>系统</td>
                <td>JSON文件存储</td>
            </tr>
        </table>
    </div>

    <div class="section">
        <h2>二、概要设计</h2>

        <h3>系统总体设计框架</h3>
        <p>在系统架构设计上，我采用了模块化的函数式编程思想。这种方法让我能够将复杂的系统功能分解为一系列高内聚、低耦合的函数模块。每个模块都有明确的职责，它们通过函数调用进行通信，并共享全局的数据结构。这种设计方式使得代码的逻辑结构清晰，提高了可读性和可维护性，也为未来可能的功能扩展打下了基础。例如，如果未来需要引入新的功能，我只需要添加新的函数模块，而不需要大规模改动现有代码。
        </p>

        <p>整个系统被划分为几个核心模块：数据持久化、用户认证、预约管理、医生排班和用户界面。这种分层设计使得每一层都专注于自己的核心任务：界面模块只负责与用户交互，业务逻辑模块处理具体的业务规则，数据持久化模块则关心数据的存储和检索。在数据持久化方面，我选择使用JSON文件而不是传统的SQL数据库。这一决定是基于项目规模和复杂度的考量。对于这个中小型系统，使用JSON文件既轻量又便捷，不需要配置复杂的数据库环境，并且JSON格式的文本文件具有良好的可读性，非常便于在开发阶段进行调试和数据校验。每一次关键的数据变更后，系统都会自动将内存中的数据序列化为JSON字符串并写入文件，从而确保了数据的持久性和一致性。
        </p>

        <div class="diagram">
            <p><strong>系统功能模块图</strong></p>
            <div class="mermaid">
                graph TD
                A[医院预约挂号系统] --> B[用户界面模块];
                A --> C[业务逻辑模块];
                A --> D[数据持久化模块];
                A --> E[全局数据存储];

                subgraph C
                C1[用户认证]
                C2[预约管理]
                C3[医生排班]
                end

                subgraph E
                E1[用户注册表]
                E2[医患数据库]
                E3[预约记录]
                end
            </div>
        </div>
    </div>

    <div class="section">
        <h2>三、详细设计</h2>

        <h3>主要阐述功能模块的算法设计思路</h3>

        <h4>用户登录流程设计</h4>
        <p>用户登录是系统的门户，其流程设计的核心在于安全性和准确性。我为此绘制了下面的流程图来梳理逻辑。整个流程从用户输入凭据开始，由用户界面函数（如 `handle_login`）捕获输入，并调用认证模块的
            `verify_credentials`
            函数。这个方法是登录逻辑的核心，它首先检查用户名是否存在，如果不存在则直接中断流程并返回错误。如果用户名存在，它会用与注册时完全相同的SHA256算法对用户输入的密码进行哈希运算，然后将得到的哈希值与数据库中存储的该用户的哈希值进行严格比对。只有两者完全一致，认证才算通过。认证成功后，系统会返回用户的角色信息，并根据角色（患者或医生）将其导航至对应的功能菜单。任何一个环节出错，都会向用户返回明确的错误提示。
        </p>
        <div class="diagram">
            <p><strong>用户登录流程图</strong></p>
            <div class="mermaid">
                graph TD
                A[用户输入凭据] --> B[验证用户名]
                B --> C{用户存在?}
                C -->|否| D[显示用户不存在]
                C -->|是| E[验证密码哈希]
                E --> F{密码正确?}
                F -->|否| G[显示密码错误]
                F -->|是| H[获取用户角色]
                H --> I{角色类型}
                I -->|患者| J[患者功能菜单]
                I -->|医生| K[医生功能菜单]
                D --> L[返回登录界面]
                G --> L

                style A fill:#e1f5fe
                style J fill:#c8e6c9
                style K fill:#fff3e0
                style D fill:#ffcdd2
                style G fill:#ffcdd2
            </div>
        </div>

        <h4>核心算法：时间段管理</h4>
        <p>在具体的算法实现上，我遇到了几个关键的技术挑战。首先是时间段管理算法的设计。当医生设置了一个出诊时间段，比如上午9:00到12:00，这个时间段需要支持多个患者的分段预约。我设计的算法思路是将时间段表示为元组的形式`(start_time,
            end_time)`，并存放在一个列表中。当患者预约其中的一部分时间（比如9:30到10:30），系统需要将原始时间段进行切分。具体的实现过程是：首先检查预约时间是否能完全包含在一个可用时间段内，如果可以，则从可用时间列表中移除原始时间段，然后根据预约时间的位置，计算出剩余的时间，并将新的剩余时间段（一个或两个）添加回可用时间列表。这个过程确保了医生的时间表总是保持最新和准确的状态，是防止重复预约的关键所在。
        </p>
    </div>

    <div class="section">
        <h2>四、调试分析过程描述</h2>

        <p>在系统开发过程中，我遇到了不少技术问题，每个问题的解决都让我对Python编程有了更深入的理解。这个过程虽然充满挑战，但也带来了巨大的成长。它让我明白，一个健壮的程序是在不断的调试和重构中诞生的。</p>

        <p>最具挑战性的问题是时间段管理中的逻辑错误。最初的算法在处理时间段切分时，对于某些边界情况考虑不周。比如，当患者预约的时间正好是某个可用时间段的开始或结束部分时，程序有时会产生一个空的时间段（如 `('10:00',
            '10:00')`），或者在切分后出现重叠。我通过在代码的关键节点加入大量的`print`语句，来实时追踪时间段列表的变化。通过这种"笨办法"，我一步步观察数据的流转，最终定位到了逻辑判断中的一个微小错误。修复这个错误后，我认识到对于复杂的逻辑，单元测试是多么重要。如果一开始就为这个模块编写了单元测试，就能更早地发现并定位问题。
        </p>

        <p>另一个让我印象深刻的问题是数据持久化时的序列化错误。当我尝试将包含`datetime`对象的预约记录直接写入JSON文件时，程序抛出了`TypeError: Object of type 'datetime' is
            not JSON
            serializable`的异常。这时我才意识到，JSON作为一种通用的数据交换格式，只支持几种基本的数据类型，它并不知道如何处理Python中特定的对象。为了解决这个问题，我必须在保存数据前，将所有的`datetime`对象转换为字符串格式（如
            'YYYY-MM-DD'），在加载数据时，再将这些字符串解析回`datetime`对象。这个过程让我对数据序列化的本质有了更深的理解，也让我明白在不同系统或格式之间进行数据交换时，数据类型的转换是一个必须仔细处理的环节。
        </p>

        <p>用户输入验证也是一个充满陷阱的领域。初期版本我假设用户总会按照提示输入正确格式的数据，但实际测试中发现，用户可能会输入非法格式的日期（如
            '2024-13-40'）、在需要输入数字的地方输入字母等。这些非法输入直接导致程序崩溃。为了提升系统的健壮性，我引入了大量的异常处理代码块（`try-except`）。例如，在使用`int()`转换用户输入时，我用`ValueError`来捕获转换失败的情况，并向用户给出友好的提示，而不是让程序直接退出。这个过程让我学会了"防御性编程"的思想，即永远不要相信用户的输入，必须对所有外部数据进行严格的校验。
        </p>

        <table>
            <tr>
                <th>问题类型</th>
                <th>出错现象</th>
                <th>出错原因</th>
                <th>解决方法</th>
                <th>效果</th>
            </tr>
            <tr>
                <td>时间段管理</td>
                <td>预约边界时间时，可用时间列表出错</td>
                <td>时间切分算法未处理边界情况</td>
                <td>增加对边界条件的判断，并用`print`调试</td>
                <td>算法健壮，各种情况均能正确处理</td>
            </tr>
            <tr>
                <td>数据序列化</td>
                <td>保存含`datetime`对象的数据时程序崩溃</td>
                <td>JSON不支持`datetime`对象</td>
                <td>在存取时手动进行字符串和对象的相互转换</td>
                <td>数据持久化功能恢复正常</td>
            </tr>
            <tr>
                <td>输入校验</td>
                <td>用户输入非法格式数据导致程序崩溃</td>
                <td>缺少对用户输入的验证和异常处理</td>
                <td>为所有输入增加`try-except`块进行校验</td>
                <td>系统健壮性显著提升，不会因非法输入而崩溃</td>
            </tr>
            <tr>
                <td>密码验证</td>
                <td>正确密码无法登录</td>
                <td>哈希处理时字符串编码不一致</td>
                <td>统一在所有哈希操作前使用`.encode('utf-8')`</td>
                <td>密码验证功能完全稳定</td>
            </tr>
        </table>
    </div>

    <div class="section">
        <h2>五、测试结果</h2>

        <h3>系统功能测试</h3>

        <p>为了确保系统的稳定性和可靠性，我设计了一套完整的测试方案，涵盖了系统的所有主要功能模块。测试过程中，我模拟了真实的用户使用场景，包括正常操作流程和各种异常情况，并记录了运行截图。</p>

        <h4>1. 用户注册与登录</h4>
        <p>测试了新用户的注册流程，包括患者和医生两种角色。并验证了使用重复用户名注册时系统会正确报错。登录功能测试了正确和错误的密码输入情况，系统均能给出正确的响应。</p>
        <div class="diagram">
            <p>[待插入"用户注册与登录"运行截图]</p>
        </div>

        <h4>2. 医生排班管理</h4>
        <p>以医生角色登录后，测试了添加新的出诊时间功能。并验证了可以为同一天添加多个不连续的时间段，系统能够正确管理这些时间。</p>
        <div class="diagram">
            <p>[待插入"医生排班管理"运行截图]</p>
        </div>

        <h4>3. 患者预约挂号</h4>
        <p>以患者角色登录后，系统会以表格形式清晰地展示所有可预约的医生。选择医生后，输入在医生可用时间内的预约请求，系统提示成功。然后尝试预约一个已被占用的时间段，系统会提示时间冲突。</p>
        <div class="diagram">
            <p>[待插入"患者预约挂号"运行截图]</p>
        </div>

        <h4>4. 预约查询与取消</h4>
        <p>测试了患者和医生两种角色的预约查询功能。患者可以看到自己的所有预约，医生则可以看到所有预约自己的患者信息。患者可以成功取消自己的预约，取消后，该时间段会重新变为医生的可用时间。</p>
        <div class="diagram">
            <p>[待插入"预约查询与取消"运行截图]</p>
        </div>

        <table>
            <tr>
                <th>测试功能</th>
                <th>测试数据</th>
                <th>预期结果</th>
                <th>实际结果</th>
                <th>测试状态</th>
            </tr>
            <tr>
                <td>用户注册</td>
                <td>用户名：test001，密码：password123</td>
                <td>注册成功，密码加密存储</td>
                <td>注册成功，SHA256加密</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>重复注册</td>
                <td>相同用户名重复注册</td>
                <td>提示用户名已存在</td>
                <td>正确提示错误信息</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>用户登录</td>
                <td>正确的用户名密码</td>
                <td>登录成功，进入对应菜单</td>
                <td>成功进入用户界面</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>错误登录</td>
                <td>错误的密码</td>
                <td>提示密码验证失败</td>
                <td>正确显示错误信息</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>预约创建</td>
                <td>在医生可用时间内预约</td>
                <td>预约成功，生成预约号</td>
                <td>预约创建成功</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>时间冲突</td>
                <td>预约不可用时间段</td>
                <td>提示医生不可用</td>
                <td>正确检测时间冲突</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>预约取消</td>
                <td>取消现有预约</td>
                <td>取消成功，释放时间段</td>
                <td>成功取消并释放时间</td>
                <td class="highlight">通过</td>
            </tr>
            <tr>
                <td>数据持久化</td>
                <td>程序重启后查看数据</td>
                <td>数据保持不变</td>
                <td>数据正确保存和加载</td>
                <td class="highlight">通过</td>
            </tr>
        </table>

        <p>测试结果表明，系统的各项核心功能都能正常工作，用户界面友好，操作流程符合预期。特别是时间冲突检测和数据持久化功能，在多种边界条件下都表现稳定。PrettyTable库的使用让数据展示变得非常美观，大大提升了用户体验。
        </p>
    </div>

    <div class="section">
        <h2>六、总结</h2>

        <h3>课程设计过程中的学习体会和收获</h3>

        <p>通过这次医院预约挂号系统的开发，我对Python编程有了更加深入和全面的理解。这不仅仅是一次编程实践，更是一次完整的软件开发体验，让我体会到了从需求分析到系统实现的整个过程。</p>

        <p>在结构化编程方面，我有了质的飞跃。以前我写的代码可能比较零散，但在这个项目中，我学会了如何通过函数和模块来组织代码。通过将不同的功能封装成不同的函数，并按模块进行划分，代码的组织结构变得清晰明了，维护起来也容易得多。这让我深刻体会到良好代码结构的重要性。
        </p>

        <p>数据结构的运用让我印象深刻。在处理医生的出诊时间时，我尝试了多种数据结构，最终选择了字典嵌套列表的方式，其中字典的键是日期，值是时间段元组的列表。这种设计在查询和修改时都非常高效，而且逻辑也很清晰。我还学会了如何合理使用列表推导式，它不仅让代码更加简洁，执行效率也更高。
        </p>

        <p>异常处理是这次项目中学到的另一个重要概念。在实际的用户交互中，各种意外情况都可能发生：用户可能输入错误的格式、文件可能不存在、网络可能中断等等。通过合理的异常处理，系统变得更加健壮，用户体验也更好。我学会了什么时候应该捕获异常，什么时候应该让异常向上传播。
        </p>

        <h3>对Python语言本次课程设计的认识</h3>

        <p>Python语言的简洁和强大在这个项目中得到了充分体现。相比其他编程语言，Python的语法更加接近自然语言，这让我能够将更多精力集中在业务逻辑的实现上，而不是纠结于语法细节。比如字典的get方法、字符串的format方法、with语句的文件操作等，这些特性让代码既简洁又优雅。
        </p>

        <p>Python丰富的标准库也给我留下了深刻印象。json模块让数据序列化变得轻而易举，hashlib模块提供了安全的哈希算法，datetime模块处理时间相关的操作。第三方库PrettyTable的使用更是让我认识到了Python生态系统的强大，几行代码就能实现美观的表格输出。
        </p>

        <p>在调试过程中，Python的错误提示信息非常详细和友好，这对于定位问题非常有帮助。特别是在处理数据类型相关的问题时，Python会明确告诉你哪里类型不匹配，这比其他语言的错误信息要清晰得多。</p>

        <h3>自己的建议</h3>

        <p>对于Python初学者，我有几点建议。首先是要多动手实践，光看书是学不会编程的，只有在实际项目中遇到问题、解决问题，才能真正掌握编程技能。其次是要善于利用Python的内置函数和标准库，不要总想着自己从零实现所有功能。再次是要重视代码的可读性，给变量和函数起有意义的名字，添加必要的注释，这不仅方便别人理解，也方便自己日后维护。
        </p>

        <p>在系统设计方面，我建议要先进行充分的需求分析，明确系统要解决什么问题，有哪些核心功能。然后再进行模块划分，将复杂的问题分解为若干个相对独立的子问题。在编码过程中，要注重测试，每实现一个功能就要及时测试，这样可以尽早发现问题，避免后期大量的调试工作。
        </p>

        <p>最后，我想说的是编程不仅仅是写代码，更是一种解决问题的思维方式。这次项目让我学会了如何将现实世界的复杂问题抽象为程序逻辑，如何在多种技术方案中选择最适合的一种，如何在功能完整性和开发效率之间找到平衡。这些经验对我今后的学习和工作都会很有帮助。
        </p>
    </div>

    <div class="section">
        <h2>七、源代码</h2>

        <h3>完整的Python程序代码</h3>

        <div class="code-block">
            # 导入所需要的库
            import json # 导入json模块用于处理JSON格式数据的序列化和反序列化操作
            import datetime # 导入datetime模块用于处理日期和时间相关的操作
            import hashlib # 导入hashlib模块用于实现密码哈希加密，提供多种安全哈希算法
            from prettytable import PrettyTable # 从prettytable库导入PrettyTable类，用于创建美观的表格输出

            # 系统数据存储容器 - 全局变量
            user_registry = {} # 用户注册表，字典类型，键为用户ID，值为用户基本信息
            patient_database = {} # 患者数据库，字典类型，存储患者的详细信息和预约记录
            doctor_database = {} # 医生数据库，字典类型，存储医生信息和出诊时间安排
            booking_records = [] # 预约记录列表，数组类型，按时间顺序存储所有预约信息

            # 数据持久化函数
            def persist_to_file():
            """数据持久化到文件"""
            system_data = { # 创建一个字典，将所有数据结构封装在一起，便于统一管理和存储
            'user_registry': user_registry, # 将用户注册表数据添加到字典中
            'patient_database': patient_database, # 将患者数据库添加到字典中
            'doctor_database': doctor_database, # 将医生数据库添加到字典中
            'booking_records': booking_records # 将预约记录列表添加到字典中
            }
            with open('hospital_system.json', 'w', encoding='utf-8') as data_file: # 以写模式打开JSON文件，使用UTF-8编码支持中文字符
            json.dump(system_data, data_file, indent=4, ensure_ascii=False) #
            将数据以JSON格式写入文件，indent=4使输出格式化，ensure_ascii=False支持中文

            # [此处省略其余代码以节省篇幅，完整代码请参考main.py文件]
        </div>

        <p class="important">注：完整源代码包含约400行，包括所有功能模块的实现。每行代码都有详细的注释说明其功能和实现原理。</p>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
    <script>mermaid.initialize({ startOnLoad: true });</script>
</body>

</html>